import { StringConstant } from '../constant'
import { BaseObject } from '../model'

// noinspection JSUnusedGlobalSymbols
/**
 * StringJoiner
 * 字符串连接
 * {@link #_separator} 分隔符, 默认为空,  允许后期更改, 影响更改后的 {@link #toString}
 * @author LL
 * @date 2022-01-24 下午 1:29
 **/
export class StringJoiner extends BaseObject {
    private strList: Array<string>

    constructor(separator: string = StringConstant.EMPTY) {
        super()
        this._separator = separator
        this.strList = []
    }

    /**
     * 分隔符
     * @type {string}
     * @private
     */
    private _separator: string

    get separator(): string {
        return this._separator
    }

    set separator(value: string) {
        this._separator = value
    }

    public override equals(o: any): boolean {
        if (super.equals(o)) {
            return true
        }
        if (!(o instanceof StringJoiner)) {
            return false
        }
        if (!(this._separator === o._separator)) {
            return false
        }
        return JSON.stringify(this.strList) === JSON.stringify(o.strList)
    }

    /**
     * 新增一个元素, 可以链式调用
     * @param {string} str
     * @return {StringJoiner}
     */
    public add(str: string): StringJoiner {
        this.strList.push(String(str))
        return this
    }

    /**
     * 新增一个元素, 可以链式调用
     * 如果 str 为 Null (Null | undefined) 忽略
     * @param {string} str
     * @return {StringJoiner}
     */
    public addNotNull(str: string): StringJoiner {
        if (str !== null && str !== undefined) {
            this.strList.push(String(str))
        }
        return this
    }

    /**
     * 新增一个元素, 可以链式调用
     * 如果 str 为 空 (Null | undefined | '' ) 忽略
     * @param {string} str
     * @return {StringJoiner}
     */
    public addNotEmpty(str: string): StringJoiner {
        if (str !== null && str !== undefined && String(str).trim().length > 0) {
            this.strList.push(String(str))
        }
        return this
    }

    /**
     * 新增一堆元素
     * @param {string[]} arr
     * @return {StringJoiner}
     */
    public addAllNotNull(arr: string[]): StringJoiner {
        if (arr && Array.isArray(arr) && arr.length > 0) {
            this.strList = this.strList.concat(arr)
        }
        return this
    }

    /**
     * 清空以前通过 各种 add 设置的元素
     * 不清空 {@link #separator}
     * (如果 separator 不同, 没必要复用吧...)
     * @return {StringJoiner}
     */
    public clear(): StringJoiner {
        this.strList = []
        return this
    }

    public override toString(): string {
        return this.strList.join(this.separator)
    }
}
